package com.zimin.web.exception;

import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;

import lombok.Data;

/**
 * @author : zimin
 * @date : 2021/6/24 3:44 下午
 * 主要用途:存储错误信息的Bean
 * 设计说明：
 * 1、官方提供了默认错误存储的{@link DefaultErrorAttributes},但其最终返回的存储结构是Map<String,Object>
 * 2、为了避免采用Map这种模糊的数据结构，故统一使用{@link ErrorInfo}来表示错误信息
 * 3、作为存储的Bean，最好不要耦合业务逻辑，故统一使用{@link ErrorInfoBuilder}来构建错误信息
 */
@Data
public class ErrorInfo {

    /**
     * 请求ip
     */
    private String ip;

    /**
     * 访问域名
     */
    private String domain;

    /**
     * 请求版本
     */
    private String version;

    /**
     * 请求参数
     */
    private String param;

    /**
     * 发生时间
     */
    private String time;

    /**
     * 访问URL
     */
    private String url;

    /**
     * 错误类型
     */
    private String error;

    /**
     * 错误的堆栈轨迹
     */
    private String stackTrace;

    /**
     * 状态码
     */
    private int statusCode;

    /**
     * 状态码-描述
     */
    private String reasonPhrase;

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder(System.lineSeparator() + "====================系统异常Start====================" + System.lineSeparator());
        sb.append("时间：").append(time).append(System.lineSeparator());
        sb.append("请求IP：").append(ip).append(System.lineSeparator());
        sb.append("参数：").append(param).append(System.lineSeparator());
        sb.append("访问URL：").append(url).append(System.lineSeparator());
        sb.append("错误类型：").append(error).append(System.lineSeparator());
        sb.append("堆栈轨迹：").append(stackTrace).append(System.lineSeparator());
        sb.append("状态码：").append(statusCode).append(System.lineSeparator());
        sb.append("状态码描述：").append(reasonPhrase).append(System.lineSeparator());
        sb.append("====================系统异常Start====================");
        return sb.toString();
    }

}
